
// 兽类
/*
class Beast {
    constructor( type ){
        this.type = type ;
        this.eat = function(food){
            console.log( '兽类动物吃' + food );
        }
    }
    run(){
        console.log( '兽类可以奔跑' );
    }
}
*/

function Beast( type ){
    this.type = type ;
    this.eat = function(food){
        console.log( '兽类动物吃' + food );
    }
}

Beast.prototype.run = function(){
    console.log( '兽类可以奔跑' );
}

/*
class Bear extends Beast {
   constructor( name ){
       super( '熊' );
       this.name = name ;
   }
}
*/

function Bear( name ){
    // 原型继承第一步: 要调用被继承对象(class-level)的构造函数
    Beast.call( this , '熊' ); // 类似于 super( '熊' )
    this.name = name ;
}

console.log( Bear.prototype.constructor === Bear );

// 原型继承第二步: 创建一个父类(Beast)的实例当作子类(Bear)的原型
Bear.prototype = new Beast();
// 原型继承第三步: 将子类原型上的constructor修改为子类构造方法
Bear.prototype.constructor = Bear ;

let b = new Bear( '熊二' );
console.log( b );
b.run();
b.eat( '蜂蜜' );

console.log( b.__proto__ === Bear.prototype ); // true
console.log( b.__proto__.__proto__ === Beast.prototype ); // true
console.log( b.__proto__.__proto__.__proto__ === Object.prototype ); // true
console.log( b.__proto__.__proto__.__proto__.__proto__ ); // null
console.log( Object.getPrototypeOf( Object.getPrototypeOf( Object.getPrototypeOf( b ) ) ) === Object.prototype );

// 尝试获取在 b 所引用实例及其原型链上不存在的属性时会返回 undefined 
console.log( b.passsowrd ); // undefined

// 尝试调用在 b 所引用实例及其原型链上不存在的函数 会抛出 TypeError
// b.login(); // TypeError: b.login is not a function